这两天研究了一下 SpringMVC 中文件上传与下载,也遇到了一些坑,这里做个总结。
1、文件上传下载的原理Web 中文件上传下载是和 HTTP 协议分不开的,想要更加深入的理解文件上传和下载,必须要对 HTTP 协议有充分认识。
1.1 文件上传在 TCP/IP 中,最早出现的文件上传机制是 FTP,这是将文件由客户端发送到服务器的标准机制。而在 Web 开发中,使用应用层协议 HTTP,通过在请求头中设置传输的内容类型 Content-Type 为 multipart/form-data; boundary=流分隔符值 来上传文件,这个流分隔符用来区分一个文件上传的开始和结束,下面的是我在火狐浏览器中截取的多个文件上传时的消息头和参数。
文件上传消息头.jpg
文件上传参数.jpg
对应在 HTML 中就是为 form 元素设置 Method = "post" enctype="`multipart/form-data" 属性,为 input 元素设置 type = "file" 以及多个文件上传时设置 "multiple" 属性,代码示例如下。
代码语言:javascript复制对表单中的 enctype 属性做个详细的说明:
application/x-www=form-urlencoded:默认方式,只处理表单域中的 value 属性值,采用这种编码方式的表单会将表单域中的值处理成 URL 编码方式。multipart/form-data:这种编码方式会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数中,不会对字符编码。text/plain:除了把空格转换为 "+" 号外,其他字符都不做编码处理,这种方式适用直接通过表单发送邮件。1.2 文件下载通过在响应消息头中设置 Content-Disposition 和 Content-Type 使得浏览器无法使用某种方式或者激活某个程序来处理 MIME 类型的文件,来让浏览器提示是否保存文件,也就是文件的下载。Content-Disposition 的值为 attachment;filename=文件名,Content-Type 的值为 application/octet-stream 或者 application/x-msdownload。文件中的中文注意编码问题,不同浏览器之间是有差异的。
文件下载.jpg
2、SpringMVC中的文件上传与下载